Ollama 可以在本机运行大语言模型,并提供 HTTP API。借助 JavaScript 客户端,Node.js 应用可以向本地模型发送对话请求。本文将介绍环境准备、模型下载、JavaScript 调用,以及如何通过微调训练自己的模型。
先说清楚一件事:
npm install ollama只安装 JavaScript 客户端,不会安装 Ollama 服务或模型。使用前还需要安装 Ollama,并下载要运行的模型。
一、准备运行环境
1. 安装 Ollama
从 Ollama 官网下载安装对应操作系统的版本:
安装完成后,在终端检查是否安装成功:
ollama --version
Ollama 通常会在本机启动服务,并通过以下地址提供 API:
http://localhost:11434
如果请求连接失败,请先确认 Ollama 应用或服务已经启动。
2. 下载模型
使用 ollama pull 下载模型:
ollama pull gemma4
模型名称和标签需要与 Ollama 模型库中实际可用的名称一致。如果这个名称不可用,请先到模型库查询正确名称和标签:
例如,下载其他模型时,命令形式通常如下:
ollama pull <模型名称>
下载后,可以用下面的命令在终端测试模型:
ollama run gemma4
模型下载后会保存在本机,不需要每次运行程序时重新下载。
二、创建 JavaScript 项目
创建一个 Node.js 项目并安装 Ollama 客户端:
mkdir ollama-js-demo
cd ollama-js-demo
npm init -y
npm install ollama
如果要在 Node.js 中使用 import 语法,可以在 package.json 中添加:
{
"type": "module"
}
也可以将 JavaScript 文件保存为 .mjs 后缀。
三、发送一条对话请求
新建 index.js:
import ollama from "ollama";
const response = await ollama.chat({
model: "gemma4",
messages: [
{
role: "user",
content: "Why is the sky blue?",
},
],
});
console.log(response.message.content);
运行程序:
node index.js
这里的 model 必须对应本机已经下载的模型名称。若运行时报模型不存在,请先执行:
ollama pull gemma4
对话消息格式
messages 是一个消息数组,常见角色包括:
system:设置助手的行为或回答规则。user:用户输入。assistant:模型的回答,常用于传入已有对话历史。
例如:
const response = await ollama.chat({
model: "gemma4",
messages: [
{
role: "system",
content: "你是一名严谨的中文技术助手,请用简洁的中文回答。",
},
{
role: "user",
content: "什么是 JavaScript 的 Promise?",
},
],
});
console.log(response.message.content);
四、实现多轮对话
模型不会自动记住上一次请求的内容。多轮聊天时,需要在请求中继续传入之前的消息:
import ollama from "ollama";
const messages = [
{
role: "system",
content: "你是一名耐心的 JavaScript 助教。",
},
{
role: "user",
content: "什么是闭包?",
},
];
const firstResponse = await ollama.chat({
model: "gemma4",
messages,
});
messages.push(firstResponse.message);
messages.push({
role: "user",
content: "能给我一个简单的代码示例吗?",
});
const secondResponse = await ollama.chat({
model: "gemma4",
messages,
});
console.log(secondResponse.message.content);
实际项目中,应根据上下文长度限制控制历史消息数量。对话越长,通常占用的内存和计算资源也越多。
五、流式输出
默认情况下,程序会等待模型生成完毕后再拿到完整回答。流式输出可以让回答逐步显示:
import ollama from "ollama";
const stream = await ollama.chat({
model: "gemma4",
messages: [
{
role: "user",
content: "写一段介绍 Ollama 的短文。",
},
],
stream: true,
});
for await (const part of stream) {
process.stdout.write(part.message.content);
}
流式输出适合命令行工具和聊天界面,可以减少用户等待完整回答的感受。
六、错误处理
实际应用中,建议对模型未安装、服务未启动等情况进行错误处理:
import ollama from "ollama";
try {
const response = await ollama.chat({
model: "gemma4",
messages: [
{
role: "user",
content: "你好,请用一句话介绍自己。",
},
],
});
console.log(response.message.content);
} catch (error) {
console.error("调用 Ollama 失败:", error.message);
console.error("请确认 Ollama 服务已启动,且模型已下载。");
}
常见问题:
问题 | 检查方向 |
|---|---|
无法连接服务 | 检查 Ollama 是否已安装并启动 |
模型不存在 | 检查模型名称,并运行 |
响应较慢 | 检查硬件资源、模型大小和上下文长度 |
内存不足 | 尝试使用更小的模型,或关闭其他占用资源的程序 |
七、重要安全提示
Ollama 的本地 API 适合在本机或受控服务环境中使用。若要将其用于 Web 应用,建议由自己的后端服务器调用 Ollama,再由前端请求后端。
不要在公开网页中直接暴露服务地址,也不要把密钥、个人隐私或敏感业务数据随意发送给模型。部署到服务器时,应额外配置访问控制、网络隔离和请求限流。
八、如何微调模型
1. Ollama 本身不是训练工具
Ollama 的主要用途是运行模型和提供推理接口,不是直接训练或微调模型。
常见的微调流程是:
准备训练数据。
使用训练工具对基础模型进行微调,常见方法包括 LoRA 或 QLoRA。
将训练结果导出为 Ollama 可用的模型格式,常见做法是转换为 GGUF。
编写
Modelfile,通过ollama create创建本地模型。像调用普通 Ollama 模型一样使用它。
常用训练工具包括 Transformers、PEFT、TRL、Unsloth 和 Axolotl。选择工具时,需要确认它支持目标模型架构,并检查模型许可证及硬件要求。
微调不是简单地让模型“记住几条文本”。它通常需要合适的 GPU、训练数据和训练流程。设备资源有限时,可以先从小模型和 LoRA 开始。
2. 准备训练数据
训练数据应尽量准确、清晰,并符合预期任务。常见的对话数据可以使用 JSONL 格式,即每行一个 JSON 对象,例如:
{"messages":[{"role":"user","content":"如何重置密码?"},{"role":"assistant","content":"请在登录页面点击“忘记密码”,并按提示完成验证。"}]}
{"messages":[{"role":"user","content":"如何联系技术支持?"},{"role":"assistant","content":"请通过产品内的帮助中心提交工单,并附上问题描述。"}]}
数据准备建议:
覆盖模型实际要处理的任务类型。
清理错误答案、重复内容和无关信息。
不要在训练数据中包含未经授权的个人信息或机密内容。
训练集和验证集应分开,用验证集检查模型是否过拟合。
确认训练数据、基础模型和最终模型的许可证允许你的使用方式。
训练数据的格式需要与所选训练框架兼容。上面的格式是示例,具体字段可能需要按框架要求转换。
3. 使用 LoRA 或 QLoRA 微调
LoRA 会训练一组较小的适配器参数,而不是重新训练整个模型。QLoRA 则通常通过量化基础模型来减少显存占用。
一个典型工作流如下:
选择基础模型,并确认训练框架支持该模型架构。
准备并检查训练数据。
在训练框架中指定基础模型、数据集、训练轮数、学习率和 LoRA 参数。
启动训练,并通过验证集检查结果。
保存 LoRA 适配器,或将适配器与基础模型合并。
按 Ollama 支持的格式转换或导出模型。
训练配置因模型、框架和硬件而异,因此没有适用于所有模型的一条通用训练命令。正式训练前,建议先用少量数据跑通完整流程,并记录基础模型的精确名称、版本和来源。
4. 转换模型并导入 Ollama
Ollama 可以通过 Modelfile 创建本地模型。常见方案是准备 GGUF 格式的基础模型,必要时再准备兼容的 LoRA 适配器。
新建一个 Modelfile:
FROM ./model.gguf
PARAMETER temperature 0.7
SYSTEM 你是一名严谨的中文技术助手,请清晰、准确地回答问题。
其中 ./model.gguf 应替换成实际模型文件路径。然后创建本地模型:
ollama create my-assistant -f Modelfile
运行新模型:
ollama run my-assistant
如果使用 LoRA 适配器,只有在适配器与基础模型及其版本兼容时才能正确加载。不同模型架构和训练工具的导出格式可能不同;请按照 Ollama 当前支持的导入格式准备文件,并在 Modelfile 中配置相应的基础模型和适配器路径。若需要合并适配器或转换 GGUF,通常要使用对应训练框架或模型转换工具完成,而不是由 ollama create 自动训练。
5. 在 JavaScript 中调用微调后的模型
创建成功后,调用方式与普通模型一致,只需将 model 换成新模型名称:
import ollama from "ollama";
const response = await ollama.chat({
model: "my-assistant",
messages: [
{
role: "user",
content: "请介绍一下你的用途。",
},
],
});
console.log(response.message.content);
九、总结
使用 JavaScript 调用 Ollama,通常需要完成以下步骤:
安装 Ollama。
下载所需模型。
安装 npm 客户端。
在 Node.js 中调用
ollama.chat()。
如果要微调模型,则需要额外使用训练框架准备数据并完成训练,再将结果导出为 Ollama 可用的格式。Ollama 负责模型运行与调用,微调训练通常由其他机器学习工具完成。